package com.maple.retry.service;


import com.baomidou.mybatisplus.extension.service.IService;
import com.maple.retry.entity.RetryTaskDO;
import com.maple.retry.retrytask.enums.RetryTaskStatusEnum;
import com.maple.retry.retrytask.model.RetryTaskInfo;

import java.util.List;

/**
 * @Description RetryTaskService
 * @Date 2020/12/1 19:22
 * @Created by 王弘博
 */
public interface RetryTaskService extends IService<RetryTaskDO> {

    /**
     * 创建重试任务，并设置延迟执行时间
     *
     * @param taskInfo
     * @param delay
     */
    void create(RetryTaskInfo taskInfo, long delay);

    /**
     * 将补偿任务归档到历史表
     *
     * @param taskInfo 补偿任务
     */
    void archive(RetryTaskInfo taskInfo);

    /**
     * 加载指定的补偿任务
     *
     * @param taskId 任务id
     * @return {@link RetryTaskInfo}
     */
    RetryTaskInfo loadByTaskId(String taskId);

    /**
     * 根据bizId和bizType查询补偿任务归档记录
     *
     * @param bizId   业务id
     * @param bizType 业务类型
     * @return {@link RetryTaskInfo}
     */
    RetryTaskInfo loadArchivedTaskByBizInfo(String bizId, String bizType);

    /**
     * 捞取待执行的重试任务列表
     *
     * @param bizType  重试任务业务类型
     * @param loadSize 重试任务长度
     * @return {@link RetryTaskInfo}
     */
    List<RetryTaskInfo> loadScheduleTasks(String bizType, Integer loadSize);

    /**
     * 加载并锁定指定的重试任务
     *
     * @param taskId 任务id
     * @return {@link RetryTaskInfo}
     */
    RetryTaskInfo lockByTaskId(String taskId);

    /**
     * 加载并锁定指定的重试任务
     *
     * @param bizId   业务id
     * @param bizType 业务类型
     * @return {@link RetryTaskInfo}
     */
    RetryTaskInfo lockByBizInfo(String bizId, String bizType);

    /**
     * 任务执行失败,等待下一次调度
     *
     * @param taskId 任务id
     * @param delay  下一次调度间隔时间,单位为毫秒(ms)
     */
    void updateRetryInfo(String taskId, long delay);

    /**
     * 删除指定的任务
     *
     * @param taskId 任务id
     */
    void drop(String taskId);

    /**
     * Update Status By Task Id
     *
     * @param taskInfo CompensateTaskInfo
     * @param status   CompensateTaskStatusEnum
     */
    void updateStatusByTaskId(RetryTaskInfo taskInfo, RetryTaskStatusEnum status);

    /**
     * Similar to updateRetryInfo with additional of status update
     *
     * @param taskInfo RetryTaskInfo
     * @param status   RetryTaskStatusEnum
     * @param delay    delay
     */
    void updateRetryAndStatusByTaskId(RetryTaskInfo taskInfo, RetryTaskStatusEnum status, long delay);

    /**
     * Similar to loadScheduleTasks with additional of status criteria
     *
     * @param bizType  bizType
     * @param loadSize loadSize
     * @param status   status
     * @return List<RetryTaskInfo>
     */
    List<RetryTaskInfo> loadScheduleTasksByStatus(String bizType, Integer loadSize,
                                                  RetryTaskStatusEnum status);
}
